void
-GeoJsonFormat::rd_init(const QString& fname) {
- ifd = new gpsbabel::File(fname);
- ifd->open(QIODevice::ReadOnly | QIODevice::Text);
+GeoJsonFormat::rd_init(const QString& fname)
+{
+ ifd = new gpsbabel::File(fname);
+ ifd->open(QIODevice::ReadOnly | QIODevice::Text);
}
void
-GeoJsonFormat::wr_init(const QString& fname) {
+GeoJsonFormat::wr_init(const QString& fname)
+{
feature_collection = new QJsonArray;
ofd = new gpsbabel::File(fname);
ofd->open(QIODevice::WriteOnly);
if (!properties.empty()) {
feature[PROPERTIES] = properties;
}
-
+
feature_collection->append(feature);
}
void
-GeoJsonFormat::rd_deinit() {
+GeoJsonFormat::rd_deinit()
+{
ifd->close();
delete ifd;
ifd = nullptr;
}
void
-GeoJsonFormat::wr_deinit() {
+GeoJsonFormat::wr_deinit()
+{
QJsonObject object;
object[TYPE] = FEATURE_COLLECTION;
object[FEATURES] = *feature_collection;
feature_collection = nullptr;
}
-Waypoint*
+Waypoint*
GeoJsonFormat::waypoint_from_coordinates(const QJsonArray& coordinates)
{
- auto waypoint = new Waypoint();
- waypoint->latitude = coordinates.at(1).toDouble();
- waypoint->longitude = coordinates.at(0).toDouble();
- if (coordinates.size() > 2)
- {
- waypoint->altitude = coordinates.at(3).toDouble();
- }
- return waypoint;
+ auto* waypoint = new Waypoint();
+ waypoint->latitude = coordinates.at(1).toDouble();
+ waypoint->longitude = coordinates.at(0).toDouble();
+ if (coordinates.size() > 2) {
+ waypoint->altitude = coordinates.at(3).toDouble();
+ }
+ return waypoint;
}
-void
+void
GeoJsonFormat::routes_from_polygon_coordinates(const QJsonArray& polygon)
{
- for (auto && lineStringIterator : polygon)
- {
- QJsonArray coordinates = (lineStringIterator).toArray();
- auto* route = new route_head;
- route_add_head(route);
- for (auto && coordinate : coordinates)
- {
- auto waypoint = waypoint_from_coordinates(coordinate.toArray());
- route_add_wpt(route, waypoint);
- }
- }
+ for (auto&& lineStringIterator : polygon) {
+ QJsonArray coordinates = (lineStringIterator).toArray();
+ auto* route = new route_head;
+ route_add_head(route);
+ for (auto&& coordinate : coordinates) {
+ auto* waypoint = waypoint_from_coordinates(coordinate.toArray());
+ route_add_wpt(route, waypoint);
+ }
+ }
}
void
-GeoJsonFormat::read() {
- QString file_content = ifd->readAll();
- QJsonParseError error{};
- QJsonDocument document = QJsonDocument::fromJson(file_content.toUtf8(), &error);
+GeoJsonFormat::read()
+{
+ QString file_content = ifd->readAll();
+ QJsonParseError error{};
+ QJsonDocument document = QJsonDocument::fromJson(file_content.toUtf8(), &error);
if (error.error != QJsonParseError::NoError) {
fatal(FatalMsg().nospace() << MYNAME << ": GeoJSON parse error in " << ifd->fileName() << ": " << error.errorString());
}
- QJsonObject rootObject = document.object();
-
- if (rootObject[TYPE] != FEATURE_COLLECTION)
- {
- return;
- }
- QJsonArray features = rootObject.value(FEATURES).toArray();
- for (auto && iterator : features)
- {
- QJsonObject feature = iterator.toObject();
- QJsonObject properties = (feature.value(PROPERTIES)).toObject();
- QString name;
- QString description;
- if (!properties.empty())
- {
- if (properties.contains(NAME))
- {
- name = properties[NAME].toString();
- }
- if (properties.contains(DESCRIPTION))
- {
- description = properties[DESCRIPTION].toString();
- }
- }
-
- QJsonObject geometry = feature.value(GEOMETRY).toObject();
- auto geometry_type = geometry[TYPE];
- if (geometry_type == POINT)
- {
- QJsonArray coordinates = geometry.value(COORDINATES).toArray();
- auto waypoint = waypoint_from_coordinates(coordinates);
- waypoint->shortname = name;
- waypoint->description = description;
- if (properties.contains(URL))
- {
- QString url = properties[URL].toString();
- if (properties.contains(URLNAME))
- {
- QString url_text = properties[URLNAME].toString();
- waypoint->AddUrlLink(UrlLink(url, url_text));
- }
- else
- {
- waypoint->AddUrlLink(UrlLink(url));
- }
- }
- waypt_add(waypoint);
- }
- else if (geometry_type == MULTIPOINT)
- {
- QJsonArray coordinates = geometry.value(COORDINATES).toArray();
- for (auto && coordinate : coordinates)
- {
- auto waypoint = waypoint_from_coordinates(coordinate.toArray());
- waypt_add(waypoint);
- }
- }
- else if (geometry_type == LINESTRING)
- {
- QJsonArray coordinates = geometry.value(COORDINATES).toArray();
- auto* route = new route_head;
- route->rte_name = name;
- route_add_head(route);
- for (auto && coordinate : coordinates)
- {
- auto waypoint = waypoint_from_coordinates(coordinate.toArray());
- route_add_wpt(route, waypoint);
- }
- }
- else if (geometry_type == POLYGON)
- {
- QJsonArray polygon = geometry.value(COORDINATES).toArray();
- routes_from_polygon_coordinates(polygon);
- }
- else if (geometry_type == MULTIPOLYGON)
- {
- QJsonArray polygons = geometry.value(COORDINATES).toArray();
- for (auto && polygons_iterator : polygons)
- {
- QJsonArray polygon = polygons_iterator.toArray();
- routes_from_polygon_coordinates(polygon);
- }
- }
- else if (geometry_type == MULTILINESTRING)
- {
- QJsonArray line_strings = geometry.value(COORDINATES).toArray();
- for (auto && line_string : line_strings)
- {
- QJsonArray coordinates = line_string.toArray();
- auto* route = new route_head;
- track_add_head(route);
- for (auto && coordinate : coordinates)
- {
- auto waypoint = waypoint_from_coordinates(coordinate.toArray());
- route_add_wpt(route, waypoint);
- }
- }
- }
- }
+ QJsonObject rootObject = document.object();
+
+ if (rootObject[TYPE] != FEATURE_COLLECTION) {
+ return;
+ }
+ QJsonArray features = rootObject.value(FEATURES).toArray();
+ for (auto&& iterator : features) {
+ QJsonObject feature = iterator.toObject();
+ QJsonObject properties = (feature.value(PROPERTIES)).toObject();
+ QString name;
+ QString description;
+ if (!properties.empty()) {
+ if (properties.contains(NAME)) {
+ name = properties[NAME].toString();
+ }
+ if (properties.contains(DESCRIPTION)) {
+ description = properties[DESCRIPTION].toString();
+ }
+ }
+
+ QJsonObject geometry = feature.value(GEOMETRY).toObject();
+ auto geometry_type = geometry[TYPE];
+ if (geometry_type == POINT) {
+ QJsonArray coordinates = geometry.value(COORDINATES).toArray();
+ auto* waypoint = waypoint_from_coordinates(coordinates);
+ waypoint->shortname = name;
+ waypoint->description = description;
+ if (properties.contains(URL)) {
+ QString url = properties[URL].toString();
+ if (properties.contains(URLNAME)) {
+ QString url_text = properties[URLNAME].toString();
+ waypoint->AddUrlLink(UrlLink(url, url_text));
+ } else {
+ waypoint->AddUrlLink(UrlLink(url));
+ }
+ }
+ waypt_add(waypoint);
+ } else if (geometry_type == MULTIPOINT) {
+ QJsonArray coordinates = geometry.value(COORDINATES).toArray();
+ for (auto&& coordinate : coordinates) {
+ auto* waypoint = waypoint_from_coordinates(coordinate.toArray());
+ waypt_add(waypoint);
+ }
+ } else if (geometry_type == LINESTRING) {
+ QJsonArray coordinates = geometry.value(COORDINATES).toArray();
+ auto* route = new route_head;
+ route->rte_name = name;
+ route_add_head(route);
+ for (auto&& coordinate : coordinates) {
+ auto* waypoint = waypoint_from_coordinates(coordinate.toArray());
+ route_add_wpt(route, waypoint);
+ }
+ } else if (geometry_type == POLYGON) {
+ QJsonArray polygon = geometry.value(COORDINATES).toArray();
+ routes_from_polygon_coordinates(polygon);
+ } else if (geometry_type == MULTIPOLYGON) {
+ QJsonArray polygons = geometry.value(COORDINATES).toArray();
+ for (auto&& polygons_iterator : polygons) {
+ QJsonArray polygon = polygons_iterator.toArray();
+ routes_from_polygon_coordinates(polygon);
+ }
+ } else if (geometry_type == MULTILINESTRING) {
+ QJsonArray line_strings = geometry.value(COORDINATES).toArray();
+ for (auto&& line_string : line_strings) {
+ QJsonArray coordinates = line_string.toArray();
+ auto* route = new route_head;
+ track_add_head(route);
+ for (auto&& coordinate : coordinates) {
+ auto* waypoint = waypoint_from_coordinates(coordinate.toArray());
+ route_add_wpt(route, waypoint);
+ }
+ }
+ }
+ }
}
-void GeoJsonFormat::geojson_track_hdr(const route_head* track) {
+void GeoJsonFormat::geojson_track_hdr(const route_head* track)
+{
track_object = new QJsonObject();
(*track_object)[TYPE] = FEATURE;
(*track_coords).append(coords);
}
-void GeoJsonFormat::geojson_track_tlr(const route_head* /*unused*/) {
+void GeoJsonFormat::geojson_track_tlr(const route_head* /*unused*/)
+{
QJsonObject geometry;
geometry[TYPE] = LINESTRING;
geometry[COORDINATES] = *track_coords;
}
void
-GeoJsonFormat::write() {
+GeoJsonFormat::write()
+{
auto geojson_waypt_pr_lambda = [this](const Waypoint* waypointp)->void {
geojson_waypt_pr(waypointp);
};
// Remove outer quotes.
// Should probably be in csv_util.
-QString XcsvStyle::dequote(const QString& in) {
+QString XcsvStyle::dequote(const QString& in)
+{
QString r = in.simplified();
- if (r.startsWith("\"")) r = r.mid(1);
- if (r.endsWith("\"")) r.chop(1);
+ if (r.startsWith("\"")) {
+ r = r.mid(1);
+ }
+ if (r.endsWith("\"")) {
+ r.chop(1);
+ }
return r;
}
-void XcsvStyle::validate_fieldmap(const field_map& fmp, bool is_output) {
+void XcsvStyle::validate_fieldmap(const field_map& fmp, bool is_output)
+{
if (fmp.key.isEmpty()) {
fatal(FatalMsg() << MYNAME << ": xcsv style is missing" <<
- (is_output ? "output" : "input") << "field type.");
+ (is_output ? "output" : "input") << "field type.");
}
if (fmp.val.isNull()) {
fatal(FatalMsg() << MYNAME << ": xcsv style" << fmp.key.constData() << "is missing default.");
}
return QString::asprintf(format,
- stmp->tm_hour, stmp->tm_min, stmp->tm_sec,
- (stmp->tm_hour >= 12 ? "PM" : "AM"));
+ stmp->tm_hour, stmp->tm_min, stmp->tm_sec,
+ (stmp->tm_hour >= 12 ? "PM" : "AM"));
}
QString
/* xcsv_parse_val() - parse incoming data into the waypt structure. */
/* usage: xcsv_parse_val("-123.34", *waypt, *field_map) */
/*****************************************************************************/
-void
+void
XcsvFormat::xcsv_parse_val(const QString& value, Waypoint* wpt, const XcsvStyle::field_map& fmp,
- xcsv_parse_data* parse_data, const int line_no)
+ xcsv_parse_data* parse_data, const int line_no)
{
const char* enclosure = "";
geocache_data* gc_data = nullptr;
wpt->icon_descr = value.trimmed();
break;
- /* LATITUDE CONVERSIONS**************************************************/
+ /* LATITUDE CONVERSIONS**************************************************/
case XcsvStyle::XT_LAT_DECIMAL:
/* latitude as a pure decimal value */
wpt->latitude = atof(s);
case XcsvStyle::XT_LAT_NMEA:
wpt->latitude = ddmm2degrees(atof(s));
break;
- // XT_LAT_10E is handled outside the switch.
- /* LONGITUDE CONVERSIONS ***********************************************/
+ // XT_LAT_10E is handled outside the switch.
+ /* LONGITUDE CONVERSIONS ***********************************************/
case XcsvStyle::XT_LON_DECIMAL:
/* longitude as a pure decimal value */
wpt->longitude = atof(s);
case XcsvStyle::XT_LON_NMEA:
wpt->longitude = ddmm2degrees(atof(s));
break;
- // case XcsvStyle::XT_LON_10E is handled outside the switch.
- /* LAT AND LON CONVERSIONS ********************************************/
+ // case XcsvStyle::XT_LON_10E is handled outside the switch.
+ /* LAT AND LON CONVERSIONS ********************************************/
case XcsvStyle::XT_LATLON_HUMAN_READABLE:
human_to_dec(s, &wpt->latitude, &wpt->longitude, 0);
break;
- /* DIRECTIONS **********************************************************/
+ /* DIRECTIONS **********************************************************/
case XcsvStyle::XT_LAT_DIR:
/* latitude N/S. */
if (*s == 'n' || *s == 'N') {
case XcsvStyle::XT_LON_DIR:
/* longitude E/W. */
if (*s == 'e' || *s == 'E') {
- parse_data->lon_dir_positive = true;
+ parse_data->lon_dir_positive = true;
} else if (*s == 'w' || *s == 'W') {
parse_data->lon_dir_positive = false;
} else {
warning("parse of string '%s' on line number %d as LON_DIR failed. Expected 'e', 'E', 'w' or 'W'.\n", s, line_no);
}
break;
- /* SPECIAL COORDINATES/GRID */
+ /* SPECIAL COORDINATES/GRID */
case XcsvStyle::XT_MAP_EN_BNG:
parse_coordinates(s, DATUM_OSGB36, grid_bng,
&wpt->latitude, &wpt->longitude, MYNAME);
break;
/* ALTITUDE CONVERSIONS ************************************************/
case XcsvStyle::XT_ALT_FEET: {
- char *endptr;
+ char* endptr;
double val = strtod(s, &endptr);
if ((val == 0 && s==endptr)) {
wpt->altitude = unknown_alt;
}
break;
case XcsvStyle::XT_ALT_METERS: {
- char *endptr;
+ char* endptr;
double val = strtod(s, &endptr);
if ((val == 0 && s==endptr)) {
wpt->altitude = unknown_alt;
}
break;
- /* PATH CONVERSIONS ************************************************/
+ /* PATH CONVERSIONS ************************************************/
case XcsvStyle::XT_PATH_SPEED:
WAYPT_SET(wpt, speed, atof(s));
break;
WAYPT_SET(wpt, course, atof(s));
break;
- /* TIME CONVERSIONS ***************************************************/
+ /* TIME CONVERSIONS ***************************************************/
case XcsvStyle::XT_EXCEL_TIME:
/* Time as Excel Time */
wpt->SetCreationTime(excel_to_timet(atof(s)));
wpt->creation_time = wpt->creation_time.addSecs(sscanftime(s, fmp.printfc.constData(), 1));
}
break;
- /* Useful when time and date are in separate fields
- GMT / Local offset is handled by the two cases above */
+ /* Useful when time and date are in separate fields
+ GMT / Local offset is handled by the two cases above */
case XcsvStyle::XT_HMSG_TIME:
case XcsvStyle::XT_HMSL_TIME:
wpt->creation_time = wpt->creation_time.addSecs(addhms(s, fmp.printfc.constData()));
wpt->AllocGCData()->last_found = yyyymmdd_to_time(s);
break;
- /* GEOCACHING STUFF ***************************************************/
+ /* GEOCACHING STUFF ***************************************************/
case XcsvStyle::XT_GEOCACHE_DIFF:
/* Geocache Difficulty as an int */
wpt->AllocGCData()->diff = atof(s) * 10;
}
break;
- /* GPS STUFF *******************************************************/
+ /* GPS STUFF *******************************************************/
case XcsvStyle::XT_GPS_HDOP:
wpt->hdop = atof(s);
break;
}
}
break;
- /* Tracks and routes *********************************************/
+ /* Tracks and routes *********************************************/
case XcsvStyle::XT_ROUTE_NAME:
parse_data->rte_name = csv_stringtrim(s, enclosure);
break;
parse_data->trk_name = csv_stringtrim(s, enclosure);
break;
- /* OTHER STUFF ***************************************************/
+ /* OTHER STUFF ***************************************************/
case XcsvStyle::XT_PATH_DISTANCE_METERS:
wpt->odometer_distance = atof(s);
break;
case XcsvStyle::XT_TEMPERATURE_F:
wpt->temperature = (FAHRENHEIT_TO_CELSIUS(atof(s)));
break;
- /* GMSD ****************************************************************/
+ /* GMSD ****************************************************************/
case XcsvStyle::XT_COUNTRY: {
garmin_fs_t* gmsd = gmsd_init(wpt);
garmin_fs_t::set_country(gmsd, csv_stringtrim(value, enclosure, 0));
while (true) {
QString buff = xcsv_file->stream.readLine();
- if (buff.isNull()) {
+ if (buff.isNull()) {
break;
}
linecount++;
* is whitespace and we have leading whitespace.
*/
// This could be hoisted out as a generic rtrim() if we need such a thing.
- while(buff.size() > 0 && buff.at(buff.size() - 1).isSpace()) {
- buff.chop(1);
+ while (buff.size() > 0 && buff.at(buff.size() - 1).isSpace()) {
+ buff.chop(1);
}
/* skip over x many lines on the top for the prologue... */
* pre-read the file to know how many data lines we should be seeing,
* we take this cheap shot at the data and cross our fingers.
*/
- for(const auto& ogp : qAsConst(xcsv_style->epilogue)) {
- if (ogp.startsWith(buff)) {
- buff.clear();
- break;
- }
+ for (const auto& ogp : qAsConst(xcsv_style->epilogue)) {
+ if (ogp.startsWith(buff)) {
+ buff.clear();
+ break;
+ }
}
if (!buff.isEmpty()) {
auto* wpt_tmp = new Waypoint;
// initialize parse data for accumulation of line results from all fields in this line.
xcsv_parse_data parse_data;
const QStringList values = csv_linesplit(buff, xcsv_style->field_delimiter,
- xcsv_style->field_encloser, linecount);
+ xcsv_style->field_encloser, linecount);
if (xcsv_style->ifields.isEmpty()) {
fatal(MYNAME ": attempt to read, but style '%s' has no IFIELDs in it.\n", qPrintable(xcsv_style->description)? qPrintable(xcsv_style->description) : "unknown");
}
break;
case XcsvStyle::XT_SHORTNAME:
- buff = QString::asprintf(fmp.printfc.constData(),
- shortname.isEmpty() ? fmp.val.constData() : CSTR(shortname));
+ buff = QString::asprintf(fmp.printfc.constData(),
+ shortname.isEmpty() ? fmp.val.constData() : CSTR(shortname));
break;
- case XcsvStyle::XT_ANYNAME:
- {
+ case XcsvStyle::XT_ANYNAME: {
QString anyname = wpt->shortname;
if (anyname.isEmpty()) {
anyname = mkshort(xcsv_file->mkshort_handle, wpt->description);
anyname = fmp.val.constData();
}
buff = QString::asprintf(fmp.printfc.constData(), CSTR(anyname));
- }
+ }
- break;
+ break;
case XcsvStyle::XT_DESCRIPTION:
buff = QString::asprintf(fmp.printfc.constData(),
- description.isEmpty() ? fmp.val.constData() : CSTR(description));
+ description.isEmpty() ? fmp.val.constData() : CSTR(description));
break;
case XcsvStyle::XT_NOTES:
buff = QString::asprintf(fmp.printfc.constData(),
- wpt->notes.isEmpty() ? fmp.val.constData() : CSTR(wpt->notes));
+ wpt->notes.isEmpty() ? fmp.val.constData() : CSTR(wpt->notes));
break;
case XcsvStyle::XT_URL: {
if (xcsv_urlbase) {
if (wpt->HasUrlLink()) {
UrlLink l = wpt->GetUrlLink();
buff = QString::asprintf(fmp.printfc.constData(),
- !l.url_link_text_.isEmpty() ? CSTR(l.url_link_text_) : fmp.val.constData());
+ !l.url_link_text_.isEmpty() ? CSTR(l.url_link_text_) : fmp.val.constData());
}
break;
case XcsvStyle::XT_ICON_DESCR:
buff = QString::asprintf(fmp.printfc.constData(),
- (!wpt->icon_descr.isNull()) ?
- CSTR(wpt->icon_descr) : fmp.val.constData());
+ (!wpt->icon_descr.isNull()) ?
+ CSTR(wpt->icon_descr) : fmp.val.constData());
break;
- /* LATITUDE CONVERSION***********************************************/
+ /* LATITUDE CONVERSION***********************************************/
case XcsvStyle::XT_LAT_DECIMAL:
/* latitude as a pure decimal value */
buff = QString::asprintf(fmp.printfc.constData(), lat);
case XcsvStyle::XT_LAT_DECIMALDIR:
/* latitude as a decimal value with N/S after it */
buff = QString::asprintf(fmp.printfc.constData(), fabs(lat),
- lat_dir(lat));
+ lat_dir(lat));
break;
case XcsvStyle::XT_LAT_DIRDECIMAL:
/* latitude as a decimal value with N/S before it */
buff = QString::asprintf(fmp.printfc.constData(),
- lat_dir(lat),
- fabs(lat));
+ lat_dir(lat),
+ fabs(lat));
break;
case XcsvStyle::XT_LAT_INT32DEG:
/* latitude as an integer offset from 0 degrees */
buff = QString::asprintf(fmp.printfc.constData(),
- dec_to_intdeg(lat));
+ dec_to_intdeg(lat));
break;
case XcsvStyle::XT_LAT_DDMMDIR:
/*latitude as (degrees * 100) + decimal minutes, with N/S after it */
case XcsvStyle::XT_LAT_NMEA:
buff = QString::asprintf(fmp.printfc.constData(), degrees2ddmm(lat));
break;
- // case XcsvStyle::XT_LAT_10E is handled outside the switch.
- /* LONGITUDE CONVERSIONS*********************************************/
+ // case XcsvStyle::XT_LAT_10E is handled outside the switch.
+ /* LONGITUDE CONVERSIONS*********************************************/
case XcsvStyle::XT_LON_DECIMAL:
/* longitude as a pure decimal value */
buff = QString::asprintf(fmp.printfc.constData(), lon);
case XcsvStyle::XT_LON_DECIMALDIR:
/* latitude as a decimal value with N/S after it */
buff = QString::asprintf(fmp.printfc.constData(),
- fabs(lon),
- lon_dir(lon));
+ fabs(lon),
+ lon_dir(lon));
break;
case XcsvStyle::XT_LON_DIRDECIMAL:
/* latitude as a decimal value with N/S before it */
buff = QString::asprintf(fmp.printfc.constData(),
- lon_dir(lon),
- fabs(lon));
+ lon_dir(lon),
+ fabs(lon));
break;
case XcsvStyle::XT_LON_INT32DEG:
/* longitude as an integer offset from 0 degrees */
buff = QString::asprintf(fmp.printfc.constData(),
- dec_to_intdeg(lon));
+ dec_to_intdeg(lon));
break;
case XcsvStyle::XT_LON_DDMMDIR:
/* longitude as (degrees * 100) + decimal minutes, with W/E after it*/
break;
case XcsvStyle::XT_LATLON_HUMAN_READABLE:
buff = dec_to_human(fmp.printfc.constData(), "SN", lat);
- buff += " ";
+ buff += " ";
buff += dec_to_human(fmp.printfc.constData(), "WE", lon);
// Tidy up leading, trailing, middle whitespace.
buff = buff.simplified();
case XcsvStyle::XT_LON_NMEA:
buff = QString::asprintf(fmp.printfc.constData(), degrees2ddmm(lon));
break;
- // case XcsvStyle::XT_LON_10E is handled outside the switch.
- /* DIRECTIONS *******************************************************/
+ // case XcsvStyle::XT_LON_10E is handled outside the switch.
+ /* DIRECTIONS *******************************************************/
case XcsvStyle::XT_LAT_DIR:
/* latitude N/S as a char */
buff = QString::asprintf(fmp.printfc.constData(),
- lat_dir(lat));
+ lat_dir(lat));
break;
case XcsvStyle::XT_LON_DIR:
/* longitude E/W as a char */
buff = QString::asprintf(fmp.printfc.constData(),
- lon_dir(lon));
+ lon_dir(lon));
break;
- /* SPECIAL COORDINATES */
+ /* SPECIAL COORDINATES */
case XcsvStyle::XT_MAP_EN_BNG: {
char map[3];
double north, east;
buff = QString::asprintf(fmp.printfc.constData(), utme);
break;
- /* ALTITUDE CONVERSIONS**********************************************/
+ /* ALTITUDE CONVERSIONS**********************************************/
case XcsvStyle::XT_ALT_FEET:
/* altitude in feet as a decimal value */
if (wpt->altitude != unknown_alt) {
buff = QString::asprintf(fmp.printfc.constData(),
- METERS_TO_FEET(wpt->altitude));
+ METERS_TO_FEET(wpt->altitude));
}
break;
case XcsvStyle::XT_ALT_METERS:
/* altitude in meters as a decimal value */
if (wpt->altitude != unknown_alt) {
buff = QString::asprintf(fmp.printfc.constData(),
- wpt->altitude);
+ wpt->altitude);
}
break;
- /* DISTANCE CONVERSIONS**********************************************/
- /* prefer odometer distance. */
- /* if not available, use calculated distance from positions */
+ /* DISTANCE CONVERSIONS**********************************************/
+ /* prefer odometer distance. */
+ /* if not available, use calculated distance from positions */
case XcsvStyle::XT_PATH_DISTANCE_MILES:
/* path (route/track) distance in miles */
if (wpt->odometer_distance) {
buff = QString::asprintf(fmp.printfc.constData(), wpt->course);
break;
- /* HEART RATE CONVERSION***********************************************/
+ /* HEART RATE CONVERSION***********************************************/
case XcsvStyle::XT_HEART_RATE:
buff = QString::asprintf(fmp.printfc.constData(), wpt->heartrate);
break;
- /* CADENCE CONVERSION***********************************************/
+ /* CADENCE CONVERSION***********************************************/
case XcsvStyle::XT_CADENCE:
buff = QString::asprintf(fmp.printfc.constData(), wpt->cadence);
break;
- /* POWER CONVERSION***********************************************/
+ /* POWER CONVERSION***********************************************/
case XcsvStyle::XT_POWER:
buff = QString::asprintf(fmp.printfc.constData(), wpt->power);
break;
case XcsvStyle::XT_TEMPERATURE_F:
buff = QString::asprintf(fmp.printfc.constData(), CELSIUS_TO_FAHRENHEIT(wpt->temperature));
break;
- /* TIME CONVERSIONS**************************************************/
+ /* TIME CONVERSIONS**************************************************/
case XcsvStyle::XT_EXCEL_TIME:
/* creation time as an excel (double) time */
buff = QString::asprintf(fmp.printfc.constData(), timet_to_excel(wpt->GetCreationTime().toTime_t()));
case XcsvStyle::XT_GEOCACHE_LAST_FOUND:
buff = QString::asprintf(fmp.printfc.constData(), time_to_yyyymmdd(wpt->gc_data->last_found));
break;
- /* GEOCACHE STUFF **************************************************/
+ /* GEOCACHE STUFF **************************************************/
case XcsvStyle::XT_GEOCACHE_DIFF:
/* Geocache Difficulty as a double */
buff = QString::asprintf(fmp.printfc.constData(), wpt->gc_data->diff / 10.0);
buff = QString::asprintf(fmp.printfc.constData(), "Unknown");
}
break;
- /* Tracks and Routes ***********************************************/
+ /* Tracks and Routes ***********************************************/
case XcsvStyle::XT_TRACK_NEW:
if (csv_track) {
if (WAYPT_HAS(wpt,new_trkseg)) {
}
break;
- /* GPS STUFF *******************************************************/
+ /* GPS STUFF *******************************************************/
case XcsvStyle::XT_GPS_HDOP:
buff = QString::asprintf(fmp.printfc.constData(), wpt->hdop);
field_is_unknown = !wpt->hdop;
// return |original| after performing token replacement.
QString
-XcsvFormat::xcsv_replace_tokens(const QString& original) const {
+XcsvFormat::xcsv_replace_tokens(const QString& original) const
+{
QString replacement = original;
- // Don't do potentially expensive replacements if token prefix
- // isn't present;
- if (original.contains("__")) {
- replacement.replace("__FILE__", xcsv_file->fname);
- replacement.replace("__VERSION__", gpsbabel_testmode()? "" : gpsbabel_version);
+ // Don't do potentially expensive replacements if token prefix
+ // isn't present;
+ if (original.contains("__")) {
+ replacement.replace("__FILE__", xcsv_file->fname);
+ replacement.replace("__VERSION__", gpsbabel_testmode()? "" : gpsbabel_version);
- QDateTime dt = current_time().toUTC();
+ QDateTime dt = current_time().toUTC();
- QString dts = dt.toString("ddd MMM dd hh:mm:ss yyyy");
- replacement.replace("__DATE_AND_TIME__", dts);
+ QString dts = dt.toString("ddd MMM dd hh:mm:ss yyyy");
+ replacement.replace("__DATE_AND_TIME__", dts);
- QString d = dt.toString("MM/dd/yyyy");
- replacement.replace("__DATE__", d);
+ QString d = dt.toString("MM/dd/yyyy");
+ replacement.replace("__DATE__", d);
- QString t = dt.toString("hh:mm:ss");
- replacement.replace("__TIME__", t);
- }
+ QString t = dt.toString("hh:mm:ss");
+ replacement.replace("__TIME__", t);
+ }
return replacement;
}
/* output prologue lines, if any. */
for (const auto& line : qAsConst(xcsv_style->prologue)) {
- QString line_to_write = xcsv_replace_tokens(line);
+ QString line_to_write = xcsv_replace_tokens(line);
xcsv_file->stream << line_to_write << xcsv_style->record_delimiter;
}
style->field_delimiter = cp;
char* p = csv_stringtrim(CSTR(style->field_delimiter), " ", 0);
- /* field delimiters are always bad characters */
+ /* field delimiters are always bad characters */
if (0 == strcmp(p, "\\w")) {
style->badchars = " \n\r";
} else {
} else
- if (op == "FIELD_ENCLOSER") {
- auto cp = xcsv_get_char_from_constant_table(tokens[0]);
- style->field_encloser = cp;
+ if (op == "FIELD_ENCLOSER") {
+ auto cp = xcsv_get_char_from_constant_table(tokens[0]);
+ style->field_encloser = cp;
- char* p = csv_stringtrim(CSTR(style->field_encloser), " ", 0);
- style->badchars += p;
- xfree(p);
- } else
-
- if (op == "RECORD_DELIMITER") {
- auto cp = xcsv_get_char_from_constant_table(tokens[0]);
- style->record_delimiter = cp;
-
- // Record delimiters are always bad characters.
- auto p = csv_stringtrim(CSTR(style->record_delimiter), " ", 0);
- style->badchars += p;
- xfree(p);
-
- } else
-
- if (op == "FORMAT_TYPE") {
- if (tokens[0] == "INTERNAL") {
- style->type = ff_type_internal;
- }
- // this is almost inconceivable...
- if (tokens[0] == "SERIAL") {
- style->type = ff_type_serial;
- }
- } else
-
- if (op == "DESCRIPTION") {
- style->description = tokens[0];
- } else
-
- if (op == "EXTENSION") {
- style->extension = tokens[0];
- } else
-
- if (op == "SHORTLEN") {
- style->shortlen = tokens[0].toInt();
- } else
-
- if (op == "SHORTWHITE") {
- style->whitespace_ok = tokens[0].toInt();
- } else
-
- if (op == "BADCHARS") {
- char* sp = csv_stringtrim(CSTR(tokenstr), "\"", 1);
- QString cp = xcsv_get_char_from_constant_table(sp);
- style->badchars += cp;
- xfree(sp);
- } else
-
- if (op =="PROLOGUE") {
- style->prologue.append(tokenstr);
- } else
-
- if (op == "EPILOGUE") {
- style->epilogue.append(tokenstr);
- } else
-
- if (op == "ENCODING") {
- style->codecname = tokens[0];
- } else
-
- if (op == "DATUM") {
- style->gps_datum_name = tokens[0];
- } else
-
- if (op == "DATATYPE") {
- QString p = tokens[0].toUpper();
- if (p == "TRACK") {
- style->datatype = trkdata;
- } else if (p == "ROUTE") {
- style->datatype = rtedata;
- } else if (p == "WAYPOINT") {
- style->datatype = wptdata;
- } else {
- fatal(FatalMsg() << MYNAME << ": Unknown data type" << p);
- }
- } else
-
- if (op == "IFIELD") {
- if (tokens.size() < 3) {
- fatal(FatalMsg() << "Invalid IFIELD line: " << tokenstr);
- }
-
- // The key ("LAT_DIR") should never contain quotes.
-
- const QString key = tokens[0].simplified();
- const QString val = dequote(tokens[1]);
- const QString pfc = dequote(tokens[2]);
- xcsv_ifield_add(style, key, val, pfc);
- } else
-
- //
- // as OFIELDs are implemented as an after-thought, I'll
- // leave this as it's own parsing for now. We could
- // change the world on ifield vs ofield format later..
- //
- if (op == "OFIELD") {
- unsigned options = 0;
- // Note: simplified() has to run after split().
- if (tokens.size() < 3) {
- fatal(FatalMsg() << "Invalid OFIELD line: " << tokenstr);
- }
-
- // The key ("LAT_DIR") should never contain quotes.
- const QString key = tokens[0].simplified();
- const QString val = dequote(tokens[1]);
- const QString pfc = dequote(tokens[2]);
-
- // This is pretty lazy way to parse write options.
- // They've very rarely used, so we'll go for simple.
- // We may have split the optional fourth and final field which can contain
- // option[s], so look at all the remaining tokens.
- for (int token_idx = 3; token_idx < tokens.size(); ++token_idx) {
- QString options_string = tokens[token_idx].simplified();
- if (options_string.contains("no_delim_before")) {
- options |= options_nodelim;
- }
- if (options_string.contains("absolute")) {
- options |= options_absolute;
- }
- if (options_string.contains("optional")) {
- options |= options_optional;
- }
- }
- xcsv_ofield_add(style, key, val, pfc, options);
- }
+ char* p = csv_stringtrim(CSTR(style->field_encloser), " ", 0);
+ style->badchars += p;
+ xfree(p);
+ } else
+
+ if (op == "RECORD_DELIMITER") {
+ auto cp = xcsv_get_char_from_constant_table(tokens[0]);
+ style->record_delimiter = cp;
+
+ // Record delimiters are always bad characters.
+ auto* p = csv_stringtrim(CSTR(style->record_delimiter), " ", 0);
+ style->badchars += p;
+ xfree(p);
+
+ } else
+
+ if (op == "FORMAT_TYPE") {
+ if (tokens[0] == "INTERNAL") {
+ style->type = ff_type_internal;
+ }
+ // this is almost inconceivable...
+ if (tokens[0] == "SERIAL") {
+ style->type = ff_type_serial;
+ }
+ } else
+
+ if (op == "DESCRIPTION") {
+ style->description = tokens[0];
+ } else
+
+ if (op == "EXTENSION") {
+ style->extension = tokens[0];
+ } else
+
+ if (op == "SHORTLEN") {
+ style->shortlen = tokens[0].toInt();
+ } else
+
+ if (op == "SHORTWHITE") {
+ style->whitespace_ok = tokens[0].toInt();
+ } else
+
+ if (op == "BADCHARS") {
+ char* sp = csv_stringtrim(CSTR(tokenstr), "\"", 1);
+ QString cp = xcsv_get_char_from_constant_table(sp);
+ style->badchars += cp;
+ xfree(sp);
+ } else
+
+ if (op =="PROLOGUE") {
+ style->prologue.append(tokenstr);
+ } else
+
+ if (op == "EPILOGUE") {
+ style->epilogue.append(tokenstr);
+ } else
+
+ if (op == "ENCODING") {
+ style->codecname = tokens[0];
+ } else
+
+ if (op == "DATUM") {
+ style->gps_datum_name = tokens[0];
+ } else
+
+ if (op == "DATATYPE") {
+ QString p = tokens[0].toUpper();
+ if (p == "TRACK") {
+ style->datatype = trkdata;
+ } else if (p == "ROUTE") {
+ style->datatype = rtedata;
+ } else if (p == "WAYPOINT") {
+ style->datatype = wptdata;
+ } else {
+ fatal(FatalMsg() << MYNAME << ": Unknown data type" << p);
+ }
+ } else
+
+ if (op == "IFIELD") {
+ if (tokens.size() < 3) {
+ fatal(FatalMsg() << "Invalid IFIELD line: " << tokenstr);
+ }
+
+ // The key ("LAT_DIR") should never contain quotes.
+
+ const QString key = tokens[0].simplified();
+ const QString val = dequote(tokens[1]);
+ const QString pfc = dequote(tokens[2]);
+ xcsv_ifield_add(style, key, val, pfc);
+ } else
+
+ //
+ // as OFIELDs are implemented as an after-thought, I'll
+ // leave this as it's own parsing for now. We could
+ // change the world on ifield vs ofield format later..
+ //
+ if (op == "OFIELD") {
+ unsigned options = 0;
+ // Note: simplified() has to run after split().
+ if (tokens.size() < 3) {
+ fatal(FatalMsg() << "Invalid OFIELD line: " << tokenstr);
+ }
+
+ // The key ("LAT_DIR") should never contain quotes.
+ const QString key = tokens[0].simplified();
+ const QString val = dequote(tokens[1]);
+ const QString pfc = dequote(tokens[2]);
+
+ // This is pretty lazy way to parse write options.
+ // They've very rarely used, so we'll go for simple.
+ // We may have split the optional fourth and final field which can contain
+ // option[s], so look at all the remaining tokens.
+ for (int token_idx = 3; token_idx < tokens.size(); ++token_idx) {
+ QString options_string = tokens[token_idx].simplified();
+ if (options_string.contains("no_delim_before")) {
+ options |= options_nodelim;
+ }
+ if (options_string.contains("absolute")) {
+ options |= options_absolute;
+ }
+ if (options_string.contains("optional")) {
+ options |= options_optional;
+ }
+ }
+ xcsv_ofield_add(style, key, val, pfc, options);
+ }
}
{
gbfile* fp = gbfopen(fname, "rb", MYNAME);
XcsvStyle style;
- for (QString sbuff = gbfgetstr(fp); !sbuff.isNull(); sbuff = gbfgetstr(fp)) {
+ for (QString sbuff = gbfgetstr(fp); !sbuff.isNull(); sbuff = gbfgetstr(fp)) {
sbuff = sbuff.trimmed();
xcsv_parse_style_line(&style, sbuff);
}